package com.cc.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @author CongWT
 * @date 2018年1月23日 下午9:15:43
 * @read "Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]"
 * 		将该对象序列化成流,因为写在流里的是对象的一个拷贝，
 * 		而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
 */
public class MYCLONE implements Serializable {

	/**@author CongWT
	 * @date 2018年1月23日 下午9:15:43
	 * @read ""
	 */
	private static final long serialVersionUID = 3514604463964733669L;


	/*** 版权所有 CongWT */
	private MYCLONE() {}
	
	
	/**
	 * @author CongWT
	 * @date 2018年1月23日 下午9:15:43
	 * @read "Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]"
	 * 		将该对象序列化成流,因为写在流里的是对象的一个拷贝，
	 * 		而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
	 * @param obj （该对象需实现序列化类  Serializable ）
	 * @return T
	 */
	public static <T extends Serializable> T cloneObject(T obj) {
		T outer = null;
	      try { 
	          // 将对象写入流
	          ByteArrayOutputStream baos = new ByteArrayOutputStream();
	          ObjectOutputStream oos = new ObjectOutputStream(baos);
	          oos.writeObject(obj);
	          // 将流序列化成对象
	          ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
	          ObjectInputStream ois = new ObjectInputStream(bais);
	          outer = (T) ois.readObject();
	      } catch (IOException e) {
	          e.printStackTrace();
	      } catch (ClassNotFoundException e) {
	          e.printStackTrace();
	      }
	      return outer;
	  }
	
	
}